home *** CD-ROM | disk | FTP | other *** search
-
- #include "FRCar.h"
- #include "FRPowerUp.h"
- #include "FRTrackObjects.h"
-
- TERTTIImplementation(FRCar, TEEngineObject);
-
- bool FRCar::ms_bPowerUpsEnabled = true;
- bool FRCar::ms_bTyreDecals = true;
- bool FRCar::ms_bSmoke = true;
-
- FRCar::FRCar()
- {
- TESoundManager* pSound = TESoundManager::GetSoundManager();
- TETextureManager* pTex = TETextureManager::GetTextureManager();
- TEString Pak = "EngineSFX";
- TEString Name = "corona01";
-
- m_pFrontLight = pTex->GetTexture(Name, Pak, false, 1, true);
- Name = "corona02";
- m_pBackLight = pTex->GetTexture(Name, Pak, false, 1, true);
-
- m_ulAINode = m_ulTrackNode = m_ulLap = 0;
- m_ulLastAINodeChange = TETimer::GetTimer()->GetTime();
- m_bAIUsesHorn = false;
- m_Type = AI;
- m_State = WAITING;
- m_Visibility = NORMAL;
-
- m_fElasticity = 0.7f;
- m_fFrictionFactor = 1.0f;
-
- m_bShadow = true;
- m_pMotor = NULL;
- m_pBraking = NULL;
- m_pHorn = NULL;
-
- m_fMaxRPM = 0.0f;
- m_fRotFactor = 0.0f;
-
- m_ulNumGears = 0;
- m_aGears = NULL;
- m_fCurrentRPM = 0;
- m_lCurrentGear = NEUTRAL_GEAR;
-
- m_fPedal = 0.0f;
- m_fSteeringWheel = 0.0f;
- m_bHandbrake = false;
-
- m_fFrontAxis = 0.0f;
- m_fRearAxis = 0.0f;
-
- m_bBraking = false;
-
- m_bTransparency = false;
-
- m_fWheelWidth = 0.0f;
- m_fWheelMov = 0.0f;
-
- m_fDecalLengthLeft = 0;
- m_fDecalLengthRight = 0;
- m_pDecalLeft = NULL;
- m_pDecalRight = NULL;
-
- m_bClip = true;
- m_bDynamicLights = false;
- m_bStatic = false;
- m_bApplyGravity = false;
- m_fBrakeEfficiency = 1.0f;
-
- m_usNumExhaust = 0;
-
- m_lPowerUp = -1;
- m_ulPowerUpEndTime = 0;
- m_lPowerUpInfluence = -1;
-
- Name = "pickup.ogg";
- m_pPickup = pSound->GetSound(Name);
- Name = "fire.ogg";
- m_pFire = pSound->GetSound(Name);
- }
-
- FRCar::~FRCar()
- {
- SafeDelete(m_pFrontLight);
- SafeDelete(m_pBackLight);
-
- SafeDelete(m_pPickup);
- SafeDelete(m_pFire);
-
- SafeDelete(m_pMotor);
- SafeDelete(m_pBraking);
- SafeDelete(m_pHorn);
- SafeDeleteA(m_aGears);
- }
-
- void FRCar::Horn(void)
- {
- if(m_pHorn != NULL && !m_pHorn->IsPlaying())
- m_pHorn->Play3D(m_Center, m_Velocity, 0, 1.0f);
- }
-
- void FRCar::SetPedal(Float fPedal)
- {
- if(fPedal > 1.0f)
- fPedal = 1.0f;
- if(fPedal < -1.0f)
- fPedal = -1.0f;
-
- m_fPedal = fPedal;
- }
-
- void FRCar::SetSteeringWheel(Float fWheel)
- {
- if(fWheel > 1.0f)
- fWheel = 1.0f;
- if(fWheel < -1.0f)
- fWheel = -1.0f;
-
- m_fSteeringWheel = fWheel;
- }
-
- Float FRCar::GetSpeedKMH(void)
- {
- return TEAbs(m_aGears[m_lCurrentGear].fRPMTrans * m_fCurrentRPM / m_fMaxRPM * 0.36f);
- // return m_Velocity.GetLength() * 0.36f;
- }
-
- void FRCar::SetPowerUp(UInt32 lPowerUp)
- {
- if(!ms_bPowerUpsEnabled || m_lPowerUp != -1)
- return;
-
- if(m_pPickup != NULL)
- m_pPickup->Play3D(m_Center, m_Velocity, 0, 1.5f);
-
- m_lPowerUp = lPowerUp;
- }
-
- void FRCar::EnablePowerUp(void)
- {
- if(!ms_bPowerUpsEnabled || m_lPowerUp == -1)
- return;
-
- TEVector Pos;
- TEEngineObject* pObj;
-
- if(m_lPowerUp == POWERUP_N2O && m_lPowerUpInfluence != POWERUP_N2O)
- {
- m_ulPowerUpEndTime = TETimer::GetTimer()->GetTime() + 4000;
-
- for(UInt32 ulCount = 1; ulCount < m_ulNumGears; ulCount++)
- {
- m_aGears[ulCount].fRPMChange *= 4.0f;
- m_aGears[ulCount].fRPMTrans += 250.0f;
- }
-
- m_lPowerUpInfluence = POWERUP_N2O;
- }
- else if(m_lPowerUp == POWERUP_ROCKET)
- {
- Pos = m_pBoundingVolume->GetCenter() + m_Forward * (m_CarSize.m_fZ * 0.51f + 8.0f);
- pObj = new FREMPRocket(Pos, m_Forward, m_Rotation);
- TEEngine::GetEngine()->AddObjectToWorld(pObj);
- }
- else if(m_lPowerUp == POWERUP_MINE)
- {
- Pos = m_pBoundingVolume->GetCenter() - m_Forward * (m_CarSize.m_fZ * 0.51f + 5.0f);
- pObj = new FREMPMine(Pos);
- TEEngine::GetEngine()->AddObjectToWorld(pObj);
- }
- else if(m_lPowerUp == POWERUP_OIL)
- {
- Pos = m_pBoundingVolume->GetCenter() - m_Forward * (m_CarSize.m_fZ * 0.51f + 15.0f);
- pObj = new FROilPuddle(Pos);
- TEEngine::GetEngine()->AddObjectToWorld(pObj);
- }
-
- if(m_pFire != NULL)
- m_pFire->Play3D(m_Center, m_Velocity, 0, 1.5f);
-
- m_lPowerUp = -1;
- }
-
- void FRCar::EMPHit(void)
- {
- if(m_lPowerUpInfluence == POWERUP_N2O)
- {
- for(UInt32 ulCount = 1; ulCount < m_ulNumGears; ulCount++)
- {
- m_aGears[ulCount].fRPMChange *= 0.25f;
- m_aGears[ulCount].fRPMTrans -= 250.0f;
- }
- }
-
- m_ulPowerUpEndTime = TETimer::GetTimer()->GetTime() + 3000;
- m_lPowerUpInfluence = POWERUP_MINE;
- }
-
- void FRCar::OilHit(void)
- {
- if(m_lPowerUpInfluence == POWERUP_N2O)
- {
- for(UInt32 ulCount = 1; ulCount < m_ulNumGears; ulCount++)
- {
- m_aGears[ulCount].fRPMChange *= 0.25f;
- m_aGears[ulCount].fRPMTrans -= 250.0f;
- }
- }
-
- m_ulPowerUpEndTime = TETimer::GetTimer()->GetTime() + 1000;
- m_lPowerUpInfluence = POWERUP_OIL;
- }
-
- void FRCar::Render(TERenderer* pRender, TECamera* pCam)
- {
- TEVector Tmp, Center, Cam;
- Float fScale, fDist, fMaxCorona;
-
- if(m_Visibility == INVISIBLE)
- return;
- else if(m_Visibility == BLINKING)
- {
- UInt32 ulTmp, ulTime = TETimer::GetTimer()->GetElapsedTime(m_ulLastReset);
-
- if(ulTime < 1000)
- {
- ulTmp = ulTime % 250;
-
- m_bClip = false;
-
- if(ulTmp > 75 + ulTime / 25)
- return;
- }
- else
- {
- m_bClip = true;
- m_Visibility = NORMAL;
- }
- }
-
- TEEngineObject::Render(pRender, pCam);
-
- fMaxCorona = TEEngine::GetEngine()->GetMaxCoronaDistance();
- Cam = pCam->GetPosition();
- Center = m_pBoundingVolume->GetCenter();
- fDist = (Center - Cam).GetLength();
-
- if(fDist < fMaxCorona)
- {
- if(fDist > fMaxCorona/4.0f)
- fScale = MAX_LIGHT_SIZE;
- else
- fScale = fDist * TEEngine::GetEngine()->GetCoronaFactor();
-
- if(fScale < MIN_LIGHT_SIZE)
- fScale = MIN_LIGHT_SIZE;
- else if(fScale > MAX_LIGHT_SIZE)
- fScale = MAX_LIGHT_SIZE;
-
- pRender->SetZBufferState(false);
- pRender->EnableBlending();
- pRender->SetBlendingState(BLEND_SRC_ALPHA, BLEND_ONE);
-
- pRender->SetAmbient(255, 255, 255, 192);
-
- Tmp = Center + m_aLightPos[0].m_fX * m_Right + m_aLightPos[0].m_fY * m_Up + m_aLightPos[0].m_fZ * m_Forward;
- pRender->RenderParticle(Tmp, fScale, fScale, m_pFrontLight);
-
- Tmp = Center + m_aLightPos[1].m_fX * m_Right + m_aLightPos[1].m_fY * m_Up + m_aLightPos[1].m_fZ * m_Forward;
- pRender->RenderParticle(Tmp, fScale, fScale, m_pFrontLight);
-
- if(m_fPedal < 0)
- {
- if(m_lCurrentGear == REVERSE_GEAR)
- pRender->SetAmbient(255, 255, 255, 255);
- else pRender->SetAmbient(255, 0, 0, 255);
-
- Tmp = Center + m_aLightPos[2].m_fX * m_Right + m_aLightPos[2].m_fY * m_Up + m_aLightPos[2].m_fZ * m_Forward;
- pRender->RenderParticle(Tmp, fScale, fScale, m_pBackLight);
-
- Tmp = Center + m_aLightPos[3].m_fX * m_Right + m_aLightPos[3].m_fY * m_Up + m_aLightPos[3].m_fZ * m_Forward;
- pRender->RenderParticle(Tmp, fScale, fScale, m_pBackLight);
- }
-
- pRender->SetZBufferState(true);
- pRender->DisableBlending();
- }
-
- }
-
- void FRCar::RenderShadow(TERenderer* pRender, TECamera* pCam, TELight* pLights,
- TEShadowMethod DefaultMethod, bool bMoreThanOneShadow)
- {
- // optimized shadow routines
-
- if(m_Visibility == INVISIBLE)
- return;
-
- if(DefaultMethod == SHADOW_NONE)
- return;
- else if(DefaultMethod == SHADOW_FAKE)
- {
- TEVector Center = m_pBoundingVolume->GetCenter();
- pRender->SetAmbient(192, 192, 192);
- TEEngine::GetEngine()->RenderFakeShadow(m_Forward, Center,
- m_CarSize.m_fX, m_CarSize.m_fZ);
- }
- else
- {
- TEEngine* pEngine = TEEngine::GetEngine();
- TELight *pCurrentLight;
- TEVector LightPos;
-
- pCurrentLight = GetClosestLight(pLights, LightPos);
-
- if(DefaultMethod == SHADOW_PROJECTED)
- {
- TEPlane Plane;
-
- Plane.m_Normal = TEVector(0.0f, 1.0f, 0.0f);
- Plane.m_D = 0;
-
- pRender->SetAmbient(0, 0, 0);
-
- m_pModelRef->RenderProjectedShadow(pRender, m_Center, m_Rotation,
- LightPos, Plane);
- }
- else if(DefaultMethod == SHADOW_PROJECTED_STENCIL)
- {
- TEVector Dir = m_Center - LightPos;
-
- if(!pEngine->GetTerrain()->Clips(LightPos, Dir))
- {
- TEPlane Plane;
-
- Plane.m_Normal = TEVector(0.0f, 1.0f, 0.0f);
- Plane.m_D = 0;
-
- pRender->ClearStencilBuffer();
- pRender->EnableStencilBuffer();
- pRender->EnableBlending();
- pRender->SetBlendingState(BLEND_SRC_ALPHA,
- BLEND_ONE_MINUS_SRC_ALPHA);
-
- pRender->SetStencilComp(STENCIL_COMP_EQUAL, 0, 0xFFFFFFFF);
- pRender->SetStencilOp(STENCIL_OP_KEEP, STENCIL_OP_KEEP,
- STENCIL_OP_INCREASE);
-
- pRender->SetAmbient(0, 0, 0, (UChar) (255 - ((m_afLight[0] + m_afLight[1] + m_afLight[2]) / 3.0f) * 128));
-
- m_pModelRef->RenderProjectedShadow(pRender, m_Center, m_Rotation,
- LightPos, Plane);
-
- pRender->DisableBlending();
- pRender->DisableStencilBuffer();
- }
- }
- else if(DefaultMethod == SHADOW_STENCIL_VOLUME)
- {
- TEVector Dir = m_Center - LightPos;
-
- if(!pEngine->GetTerrain()->Clips(LightPos, Dir))
- {
- pRender->SetAmbient(0, 0, 0, (UChar) (255 - ((m_afLight[0] + m_afLight[1] + m_afLight[2]) / 3.0f) * 128));
-
- m_pModelRef->RenderStencilShadow(pRender, pCam, m_Center,
- m_Rotation, LightPos);
- }
- }
- }
- }
-
- void FRCar::Animate(UInt32 ulDeltaT, TEEngine* pEngine)
- {
- Float fScale;
- TEVector Min, Max;
-
- if(m_State == WAITING || (m_ulTrackNode < 2 && m_State >= FINISHED1ST && m_State <= FINISHED4TH) ||
- ( (m_State == KO || m_State == DESTROYED) && GetSpeedKMH() < 5) )
- {
- m_pModelRef->SetTimeScale(0.0f);
- return;
- }
-
- m_bBraking = false;
-
- if(m_lCurrentGear == NEUTRAL_GEAR)
- {
- fScale = 0;
- }
- else
- {
- fScale = m_Velocity.GetLength() / 25.0f;
-
- if(fScale > 10.0f)
- fScale = 10.0f;
- }
-
-
- if(m_fSteeringWheel == 0 && m_pModelRef->GetCurrentAnimation() != 0)
- m_pModelRef->SetAnimation(0);
- else if(m_fSteeringWheel < 0.0f && m_pModelRef->GetCurrentAnimation() != 1)
- m_pModelRef->SetAnimation(1);
- else if(m_fSteeringWheel > 0.0f && m_pModelRef->GetCurrentAnimation() != 2)
- m_pModelRef->SetAnimation(2);
-
- m_pModelRef->SetTimeScale(fScale);
-
- if(m_lCurrentGear == REVERSE_GEAR)
- m_pModelRef->SetReverseAnimation(true);
- else m_pModelRef->SetReverseAnimation(false);
-
- if(m_fSteeringWheel != 0 && m_lPowerUpInfluence != POWERUP_OIL && m_Visibility != BLINKING)
- {
- TEAABoundingBox BBox;
- TEVector Min, Max;
- TEOBoundingBox* pBox = (TEOBoundingBox*) m_pBoundingVolume;
- Float fSpeed = GetSpeedKMH();
- Float fTime = ulDeltaT / 1000.0f;
-
- if(fSpeed >= 50.0f)
- {
- if(m_lCurrentGear != REVERSE_GEAR)
- m_Rotation.m_fY += m_fSteeringWheel * m_fRotFactor * fTime;
- else m_Rotation.m_fY -= m_fSteeringWheel * m_fRotFactor * fTime;
-
- }
- else
- {
- if(m_lCurrentGear != REVERSE_GEAR)
- m_Rotation.m_fY += m_fSteeringWheel * m_fRotFactor * fTime * fSpeed * 0.02f;
- else m_Rotation.m_fY -= m_fSteeringWheel * m_fRotFactor * fTime * fSpeed * 0.02f;
- }
-
- while(m_Rotation.m_fY >= 360.0f)
- m_Rotation.m_fY -= 360.0f;
- while(m_Rotation.m_fY < 0.0f)
- m_Rotation.m_fY += 360.0f;
-
- BBox = m_pModelRef->GetModelBBox();
- BBox.GetData(Min, Max);
- pBox->SetData(m_Center, Min, Max, m_Rotation);
- UpdateVectors();
- }
-
- UpdateEngine(ulDeltaT, pEngine);
-
- if(m_ulPowerUpEndTime != 0 && TETimer::GetTimer()->GetTime() > m_ulPowerUpEndTime)
- {
- m_ulPowerUpEndTime = 0;
-
- if(m_lPowerUpInfluence == POWERUP_N2O)
- {
- for(UInt32 ulCount = 1; ulCount < m_ulNumGears; ulCount++)
- {
- m_aGears[ulCount].fRPMChange *= 0.25f;
- m_aGears[ulCount].fRPMTrans -= 250.0f;
- }
- }
-
- m_lPowerUpInfluence = -1;
- }
- }
-
- void FRCar::Update(UInt32 ulDeltaT, TEEngine* pEngine)
- {
- m_Acceleration.m_fY = m_Velocity.m_fY = 0;
-
- if(m_Center.m_fY != m_fDeltaY)
- {
- Float fDelta = m_fDeltaY - m_Center.m_fY;
- TEVector Tmp = m_pBoundingVolume->GetCenter();
- Tmp.m_fY += fDelta;
- m_pBoundingVolume->SetCenter(Tmp);
- m_Center.m_fY = m_fDeltaY;
- }
-
- TEEngineObject::Update(ulDeltaT, pEngine);
-
- UInt16 usCount;
- TEVector Center = m_pBoundingVolume->GetCenter();
- Float fSpeed;
-
- fSpeed = m_Velocity.GetLength();
-
- UpdateVectors();
-
- if(((m_fPedal < 0 && m_lCurrentGear != REVERSE_GEAR) || m_bHandbrake ||
- m_lPowerUpInfluence == POWERUP_OIL) && fSpeed > MIN_DECAL_SPEED)
- {
- if(m_pBraking != NULL && !m_pBraking->IsPlaying())
- m_pBraking->Play3D(m_Center, m_Velocity, 0, 1.0f);
-
- if(ms_bTyreDecals)
- CreateTyreDecals(ulDeltaT, pEngine);
- }
- else m_pDecalLeft = m_pDecalRight = NULL;
-
- if(ms_bSmoke)
- {
- for(usCount = 0; usCount < m_usNumExhaust; usCount++)
- {
- TEVector Tmp = Center + m_aExhaustPos[usCount].m_fX * m_Right +
- m_aExhaustPos[usCount].m_fY * m_Up + m_aExhaustPos[usCount].m_fZ * m_Forward;
-
- m_aExhaust[usCount]->MoveToPosition(Tmp);
- }
- }
-
- if(m_pMotor != NULL)
- m_pMotor->UpdateProperties(m_Center, m_Velocity);
- if(m_pBraking != NULL && m_pBraking->IsPlaying())
- m_pBraking->UpdateProperties(m_Center, m_Velocity);
- if(m_pHorn != NULL && m_pHorn->IsPlaying())
- m_pHorn->UpdateProperties(m_Center, m_Velocity);
-
- if(m_pPickup != NULL && m_pPickup->IsPlaying())
- m_pPickup->UpdateProperties(m_Center, m_Velocity);
- if(m_pFire != NULL && m_pFire->IsPlaying())
- m_pFire->UpdateProperties(m_Center, m_Velocity);
- }
-
- bool FRCar::Influence(UInt32 ulDeltaT, TEEngineObject* pObject)
- {
- bool bCar = TEIsDerivedFromClass(FRCar, pObject);
-
- if(bCar && (m_Visibility == BLINKING || ((FRCar*)pObject)->m_Visibility == BLINKING))
- return false;
-
- return TEEngineObject::Influence(ulDeltaT, pObject);
- }
-
- void FRCar::OnClip(TEEngineObject* pInfluencer)
- {
- if(TEIsDerivedFromClass(FRCar, pInfluencer) &&
- m_Type == AI && m_bAIUsesHorn && !m_pHorn->IsPlaying())
- {
- TEVector Dir = pInfluencer->GetCenter() - m_Center;
- Dir.Normalize();
-
- if(Dir.DotProduct(m_Forward) >= 0.5f)
- Horn();
- }
- else if(TEIsTypeOfClass(TEBSPTerrain, pInfluencer) ||
- TEIsTypeOfClass(FRBarrier, pInfluencer))
- {
- if(m_lPowerUpInfluence == POWERUP_N2O)
- {
- for(UInt32 ulCount = 1; ulCount < m_ulNumGears; ulCount++)
- {
- m_aGears[ulCount].fRPMChange *= 0.25f;
- m_aGears[ulCount].fRPMTrans -= 250.0f;
- }
-
- m_fCurrentRPM = 1000.0f;
- m_lCurrentGear = NEUTRAL_GEAR;
- m_Velocity = m_Acceleration = TEVector(0.0f, 0.0f, 0.0f);
- m_lPowerUpInfluence = -1;
- m_ulPowerUpEndTime = 0;
- }
- else if(m_fPedal < 0.0f && m_lCurrentGear != REVERSE_GEAR)
- {
- m_fCurrentRPM = 1000.0f;
- m_lCurrentGear = NEUTRAL_GEAR;
- m_Velocity = m_Acceleration = TEVector(0.0f, 0.0f, 0.0f);
- }
- }
- }
- /*
- void FRCar::AlignToTerrain(TEEngine* pEngine)
- {
- UInt16 usCount, usMaxY, usClip = 0;
- TEMatrix3x3 XRot, YRot, ZRot;
- TEVector aW[4], aInt[4], Dir, Mov;
- bool abClip[4];
-
- XRot.XRotationMatrixDeg(-m_Rotation.m_fX);
- YRot.YRotationMatrixDeg(-m_Rotation.m_fY);
- ZRot.ZRotationMatrixDeg(-m_Rotation.m_fZ);
-
- Dir = TEVector(0, -m_CarSize.m_fZ, 0);
- memset(&abClip, false, sizeof(bool)*4);
- Mov = m_Right * m_CarSize.m_fX * 0.5f;
-
- aW[0] = m_Center;
- aW[1] = aW[0] + Mov; // right front wheel
- aW[0] -= Mov; // left front wheel
-
- aW[2] = m_Center + m_Forward * m_fRearAxis;
- aW[3] = aW[2] + Mov; // right back wheel
- aW[2] -= Mov; // left back wheel
-
- for(usCount = 0; usCount < 4; usCount++)
- {
- TEClipInfo Info;
-
- abClip[usCount] = pEngine->RayClipsInWorld(aW[usCount], Dir, Info, this);
- aInt[usCount] = Info.Intersection;
-
- if(abClip[usCount])
- {
- usMaxY = usCount;
- usClip++;
- }
- }
-
- for(usCount = 0; usCount < 4; usCount++)
- {
- if(abClip[usCount] && aInt[usCount].m_fY > aInt[usMaxY].m_fY)
- usMaxY = usCount;
- }
-
- if(usClip >= 3)
- {
- TEVector RX, RZ;
-
- switch(usMaxY){
- case 0:
- RX = aInt[0] - aInt[2];
- RZ = aInt[1] - aInt[0];
- break;
- case 1:
- RX = aInt[1] - aInt[3];
- RZ = aInt[1] - aInt[0];
- break;
- case 2:
- RX = aInt[0] - aInt[2];
- RZ = aInt[3] - aInt[2];
- break;
- case 3:
- RX = aInt[1] - aInt[3];
- RZ = aInt[3] - aInt[2];
- break;
- default:
- TEAssert(0);
- };
-
-
- RX = RX * (YRot * ZRot);
- RZ = RZ * (XRot * YRot);
-
- RX.Normalize();
- RZ.Normalize();
-
- if(RX.m_fY >= 0)
- m_Rotation.m_fX = -TEACosDeg(RX.m_fZ);
- else
- m_Rotation.m_fX = TEACosDeg(RX.m_fZ);
-
- if(RZ.m_fY >= 0)
- m_Rotation.m_fZ = TEACosDeg(RZ.m_fX);
- else
- m_Rotation.m_fZ = -TEACosDeg(RZ.m_fX);
-
- if(TEAbs(m_Rotation.m_fX) > 75.0f)
- m_Rotation.m_fX = 0;
- if(TEAbs(m_Rotation.m_fZ) > 75.0f)
- m_Rotation.m_fZ = 0;
- }
- }*/
-
- void FRCar::UpdateEngine(UInt32 ulDeltaT, TEEngine* pEngine)
- {
- Float fSpeed = m_Velocity.GetLength();
- Float fTime = ulDeltaT / 1000.0f;
-
- if(m_lPowerUpInfluence == POWERUP_MINE)
- m_fPedal = 0.0f;
-
- if(m_fPedal >= 0)
- {
- // driving forward
-
- if(m_lCurrentGear == NEUTRAL_GEAR && m_fPedal != 0)
- {
- m_lCurrentGear = FIRST_GEAR;
- }
-
- if(m_lCurrentGear == REVERSE_GEAR)
- {
- if(m_fCurrentRPM > 1000)
- m_fCurrentRPM -= m_aGears[m_lCurrentGear].fRPMChange * fTime * m_fBrakeEfficiency;
-
- if(m_fCurrentRPM <= 1000)
- {
- m_fCurrentRPM = 1000;
- m_lCurrentGear = NEUTRAL_GEAR;
- }
- }
- }
- else if(m_fPedal < 0)
- {
- if(fSpeed > 0.0001f && m_Velocity.DotProduct(m_Forward) / m_Velocity.GetLength() >= 0.99f)
- {
- // braking
-
- m_bBraking = true;
-
- if(m_fCurrentRPM > 1000)
- m_fCurrentRPM -= m_aGears[m_lCurrentGear].fRPMChange * fTime * m_fBrakeEfficiency;
-
- if(m_fCurrentRPM <= 1000)
- {
- m_fCurrentRPM = 1000;
- m_lCurrentGear = REVERSE_GEAR;
- }
- }
- else if(m_lCurrentGear != REVERSE_GEAR)
- {
- m_fCurrentRPM = 1000;
- m_lCurrentGear = REVERSE_GEAR;
- }
- }
-
- if(!m_bBraking)
- {
- if(m_lCurrentGear != NEUTRAL_GEAR)
- {
- if(m_fCurrentRPM < m_fMaxRPM)
- m_fCurrentRPM += m_aGears[m_lCurrentGear].fRPMChange * TEAbs(m_fPedal) * fTime;
- if(m_fPedal == 0)
- m_fCurrentRPM -= m_aGears[m_lCurrentGear].fRPMChange * fTime * 2.0f;
- }
- }
-
- // Shifting
- if(m_lCurrentGear > REVERSE_GEAR)
- {
- if(m_fCurrentRPM >= m_fMaxRPM && m_lCurrentGear < (Int32)(m_ulNumGears - 1))
- {
- m_fCurrentRPM -= 1000;
- m_lCurrentGear++;
- }
- if(m_fCurrentRPM < m_fMaxRPM * 0.5f && m_lCurrentGear > FIRST_GEAR)
- {
- m_fCurrentRPM += 1000;
- m_lCurrentGear--;
- }
- }
-
- if(m_lPowerUpInfluence == POWERUP_MINE)
- m_fCurrentRPM -= ulDeltaT * 5;
-
- if(m_fCurrentRPM < 1000)
- m_fCurrentRPM = 1000;
-
- if(m_lCurrentGear != NEUTRAL_GEAR)
- {
- TEVector Tmp;
-
- Tmp = m_Forward * (m_aGears[m_lCurrentGear].fRPMTrans * m_fCurrentRPM / m_fMaxRPM);
-
- if(m_bHandbrake)
- Tmp = Tmp * 0.5f;
-
- m_Acceleration.m_fX = (Tmp.m_fX - m_Velocity.m_fX) * (1000 / (Float) ulDeltaT);
- m_Acceleration.m_fZ = (Tmp.m_fZ - m_Velocity.m_fZ) * (1000 / (Float) ulDeltaT);
- }
-
- if(m_fPedal == 0 && m_fCurrentRPM <= 1000 && m_lCurrentGear == FIRST_GEAR)
- {
- m_fCurrentRPM = 1000;
- m_lCurrentGear = NEUTRAL_GEAR;
- }
- }
-
- void FRCar::UpdateVectors(void)
- {
- TEOBoundingBox* pBox = (TEOBoundingBox*) m_pBoundingVolume;
- TEPlane* pPlanes = pBox->GetPlanes();
-
- m_Forward = pPlanes[1].m_Normal;
- m_Up = pPlanes[2].m_Normal;
- m_Right = pPlanes[5].m_Normal;
- }
-
- void FRCar::Reset(TEVector &rCenter, TEVector &rNormal)
- {
- TETimer* pTimer = TETimer::GetTimer();
- UInt32 ulTime = pTimer->GetTime();
-
- if(ulTime - m_ulLastReset < 3000)
- return;
-
- TEOBoundingBox* pBox = (TEOBoundingBox*) m_pBoundingVolume;
- TEAABoundingBox BBox;
- TEVector Min, Max;
- Float fAngle = TEACosDeg(-rNormal.m_fZ);
-
- if(rNormal.m_fX > 0)
- fAngle = -fAngle;
-
- m_Rotation = TEVector(0, fAngle, 0);
- m_Center.m_fX = rCenter.m_fX;
- m_Center.m_fZ = rCenter.m_fZ;
- m_Velocity = m_Acceleration = TEVector(0,0,0);
- m_lCurrentGear = NEUTRAL_GEAR;
- m_fCurrentRPM = 1000;
-
- BBox = m_pModelRef->GetModelBBox();
- BBox.GetData(Min, Max);
- pBox->SetData(m_Center, Min, Max, m_Rotation);
-
- m_ulLastReset = ulTime;
-
- UpdateVectors();
-
- m_Visibility = BLINKING;
- }
-
- void FRCar::CreateTyreDecals(UInt32 ulDeltaT, TEEngine* pEngine)
- {
- TEVector Mov, T1, T2;
- Float fDiff;
- Mov = m_Right * (m_CarSize.m_fX * 0.5f - m_fWheelMov);
-
- T1 = m_OldCenter + m_Forward * m_fRearAxis;
- T1.m_fY = 0.0f;
- T2 = T1 + Mov; // right back wheel
- T1 = T1 - Mov; // left back wheel
- fDiff = m_Velocity.GetLength() * (ulDeltaT / 1000.0f);
-
- if(m_pDecalLeft == NULL || m_fDecalLengthLeft > MAX_TYRE_DECAL_LENGTH ||
- m_DecalForward != m_Forward)
- {
- m_DecalStartLeft = T1;
- m_fDecalLengthLeft = fDiff;
- m_pDecalLeft = new FRCarDecal(m_DecalStartLeft, m_Forward, m_fDecalLengthLeft, m_fWheelWidth);
- pEngine->AddDecal(m_pDecalLeft);
- }
- else
- {
- m_fDecalLengthLeft += fDiff;
- m_pDecalLeft->SetData(m_DecalStartLeft, m_Forward, m_fDecalLengthLeft, m_fWheelWidth);
- }
-
-
- if(m_pDecalRight == NULL || m_fDecalLengthRight > MAX_TYRE_DECAL_LENGTH ||
- m_DecalForward != m_Forward)
- {
- m_DecalStartRight = T2;
- m_fDecalLengthRight = fDiff;
- m_pDecalRight = new FRCarDecal(m_DecalStartRight, m_Forward, m_fDecalLengthRight, m_fWheelWidth);
- pEngine->AddDecal(m_pDecalRight);
- }
- else
- {
- m_fDecalLengthRight += fDiff;
- m_pDecalRight->SetData(m_DecalStartRight, m_Forward, m_fDecalLengthRight, m_fWheelWidth);
- }
-
- m_DecalForward = m_Forward;
- }
-